package com.dhcc.core.cxf.webservice.usersync;

import javax.jws.WebService;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.dhcc.core.framework.constant.state.ManagerStatus;
import com.dhcc.core.framework.security.ShiroKit;
import com.dhcc.core.framework.util.CommonUtil;
import com.dhcc.core.modules.system.dao.DeptMapper;
import com.dhcc.core.modules.system.dao.DeptUserMapper;
import com.dhcc.core.modules.system.dao.UserMapper;
import com.dhcc.core.modules.system.entity.Dept;
import com.dhcc.core.modules.system.entity.DeptUser;
import com.dhcc.core.modules.system.entity.User;

/**
 * 组织同步接口
 * @ClassName: UserSync 
 * @Description: TODO
 * @author: cyf
 * @date: 2016年8月8日 下午3:07:59
 */
@WebService
public class WsUserSyncImpl implements WsUserSync {
	@Autowired
	private UserMapper userMapper;
	@Autowired
	private DeptMapper deptMapper;
	@Autowired
	private DeptUserMapper deptUserMapper;

	/**
	 * 同步部门
	 * @Title: syncDept 
	 * @Description: TODO
	 * @param code 编码
	 * @param deptName 部门名称
	 * @param parentCode 父编码--如果为一级部门可以空 null、""
	 * @param operation 操作    1--修改或新增     2--新增    3--修改    4--删除          （默认为1，也就是说为空则修改或新增）
	 * @return
	 * @return: String
	 */
	@Override
    public String syncDept(String code,String deptName,String parentCode,Integer operation){
		JSONObject jo = new JSONObject();
    	if(StringUtils.isBlank(code)){
    		jo.put("statusCode", -1);
    		jo.put("message", "code不能为空");
            return jo.toJSONString();
    	}
    	// 删除
		if(operation==4){
			Dept selDept = new Dept();
			selDept.setCode(code);
    		Dept d = deptMapper.selectOne(selDept);
    		if(d==null||d.getId()==null){
        		jo.put("statusCode", -1);
        		jo.put("message", "code不存在，请确认");
                return jo.toJSONString();
    		}
    		int path=d.getPath().length();
    		if(path>=4){
        		jo.put("statusCode", -1);
        		jo.put("message", "该部门下存在子部门，请确认");
                return jo.toJSONString();
    		}
			/*selDept = new Dept();
			selDept.setParentId(d.getId());
    		d = deptMapper.selectOne(selDept);
    		if(d!=null&&d.getId()!=null){
        		jo.put("statusCode", -1);
        		jo.put("message", "该部门下存在子部门，请确认");
                return jo.toJSONString();
    		}*/
			// 清除用户与该部门的关系 
            Wrapper<DeptUser> wrapper = new EntityWrapper<DeptUser>();
            wrapper.eq("dept_id", d.getId());
            deptUserMapper.delete(wrapper);
			// 删除
			d.deleteById();
		}else{
	    	if(StringUtils.isBlank(deptName)){
	    		jo.put("statusCode", -1);
	    		jo.put("message", "deptName不能为空");
	            return jo.toJSONString();
	    	}
	    	// 为空默认为一级部门
	    	if(StringUtils.isBlank(parentCode)){
				Dept selDept = new Dept();
				selDept.setCode(code);
	    		Dept d = deptMapper.selectOne(selDept);
	    		if(operation==3){
	        		//修改
	        		if(d==null||d.getId()==null){
	            		jo.put("statusCode", -1);
	            		jo.put("message", "code不存在，请确认是否为修改部门");
	                    return jo.toJSONString();
	        		}
	        		d.setFullname(deptName);
	        		d.setName(deptName);
	        		d.init();
	        		d.updateById();
	    		}else if(operation==2){
	        		//新增
	        		if(d!=null&&d.getId()!=null){
	            		jo.put("statusCode", -1);
	            		jo.put("message", "该部门已存在，请确认");
	                    return jo.toJSONString();
	        		}
	        		d = new Dept();
	        		d.setCode(code);
	        		d.setFullname(deptName);
	        		d.setName(deptName);
	        		d.setWeight(1);
                    d.init();
	        		d.insert();
	    		}else{
	        		//修改或新增
	        		if(d==null||d.getId()==null){
		        		//新增
		        		d = new Dept();
		        		d.setCode(code);
		        		d.setFullname(deptName);
		        		d.setName(deptName);
		        		d.setWeight(1);
	                    d.init();
		        		d.insert();
	        		}else{
	        			//修改
		        		d.setFullname(deptName);
		        		d.setName(deptName);
	                    d.init();
		        		d.updateById();
	        		}
	    		}
	    	}else{
				Dept selp = new Dept();
				selp.setCode(code);
	    		Dept p = deptMapper.selectOne(selp);
	    		if(p==null||p.getId()==null){
	        		jo.put("statusCode", -1);
	        		jo.put("message", "parentCode不存在，请确认");
	                return jo.toJSONString();
	    		}
				Dept seld = new Dept();
				seld.setCode(code);
	    		Dept d = deptMapper.selectOne(seld);
	    		if(operation==3){
	        		//修改
	        		if(d==null||d.getId()==null){
	            		jo.put("statusCode", -1);
	            		jo.put("message", "code不存在，请确认是否为修改部门");
	                    return jo.toJSONString();
	        		}
	        		d.setFullname(deptName);
	        		d.setName(deptName);
	                d.setParentId(p.getId());
                    d.init();
	        		d.updateById();
	    		}else if(operation==2){
	        		//新增
	        		if(d!=null&&d.getId()!=null){
	            		jo.put("statusCode", -1);
	            		jo.put("message", "该部门已存在，请确认");
	                    return jo.toJSONString();
	        		}
	        		d = new Dept();
	        		d.setCode(code);
	        		d.setFullname(deptName);
	        		d.setName(deptName);
	        		d.setWeight(1);
	                d.setParentId(p.getId());
                    d.init();
	        		d.insert();
	    		}else{
	        		//修改或新增
	        		if(d==null||d.getId()==null){
		        		//新增
		        		d = new Dept();
		        		d.setCode(code);
		        		d.setFullname(deptName);
		        		d.setName(deptName);
		        		d.setWeight(1);
		                d.setParentId(p.getId());
	                    d.init();
		        		d.insert();
	        		}else{
		        		//修改
		        		d.setFullname(deptName);
		        		d.setName(deptName);
		                d.setParentId(p.getId());
	                    d.init();
		        		d.updateById();
	        		}
	    		}
	    	}
		}
		jo.put("statusCode", 0);
		jo.put("message", "操作成功");
        return jo.toJSONString();
    }
    /**
     * 同步用户
     * @Title: syncUser 
     * @Description: TODO
     * @param code 用户编码
     * @param userName 用户名
     * @param loginName 登录名（可以用code）
     * @param password 密码
     * @param deptCode 部门编码--如果为一级部门可以空 null、""
	 * @param operation 操作    1--修改或新增     2--新增    3--修改    4--删除          （默认为1，也就是说为空则修改或新增）
     * @return
     * @return: String
     */
	@Override
    public String syncUser(String code,String userName,String loginName,String password,String deptCode,Integer operation){
		JSONObject jo = new JSONObject();
    	if(StringUtils.isBlank(code)){
    		jo.put("statusCode", -1);
    		jo.put("message", "code不能为空");
            return jo.toJSONString();
    	}
    	// 删除
		if(operation==4){
			User selu = new User();
			selu.setUserCode(code);
			User u = userMapper.selectOne(selu);
    		if(u==null||u.getId()==null){
        		jo.put("statusCode", -1);
        		jo.put("message", "code不存在，请确认");
                return jo.toJSONString();
    		}
			// 清除用户与该部门的关系 
            Wrapper<DeptUser> wrapper = new EntityWrapper<DeptUser>();
            wrapper.eq("user_id", u.getId());
            deptUserMapper.delete(wrapper);
			// 删除
            u.deleteById();
		}else{
	    	if(StringUtils.isBlank(userName)){
	    		jo.put("statusCode", -1);
	    		jo.put("message", "userName不能为空");
	            return jo.toJSONString();
	    	}
	    	if(StringUtils.isBlank(loginName)){
	    		jo.put("statusCode", -1);
	    		jo.put("message", "loginName不能为空，可以是code");
	            return jo.toJSONString();
	    	}
	    	if(StringUtils.isBlank(password)){
	    		jo.put("statusCode", -1);
	    		jo.put("message", "password不能为空");
	            return jo.toJSONString();
	    	}
	    	// 为空
	    	if(StringUtils.isBlank(deptCode)){
        		jo.put("statusCode", -1);
        		jo.put("message", "deptCode不存在，请确认");
                return jo.toJSONString();
	    	}
			Dept seld = new Dept();
			seld.setCode(deptCode);
    		Dept d = deptMapper.selectOne(seld);
    		if(d==null||d.getId()==null){
        		jo.put("statusCode", -1);
        		jo.put("message", "deptCode不存在，请确认");
                return jo.toJSONString();
    		}
    		DeptUser du = null;
			User selu = new User();
			selu.setUserCode(code);
			User u = userMapper.selectOne(selu);
    		if(operation==3){
        		//修改
        		if(u==null||u.getId()==null){
            		jo.put("statusCode", -1);
            		jo.put("message", "code不存在，请确认");
                    return jo.toJSONString();
        		}
                DeptUser wrapper = new DeptUser();
                wrapper.setUserId(u.getId());
                wrapper.setDeptId(d.getId());
        		du = deptUserMapper.selectOne(wrapper);
    	        u.setPassword(ShiroKit.md5(password, u.getSalt()));
    		}else if(operation==2){
        		//新增
        		if(u!=null&&u.getId()!=null){
            		jo.put("statusCode", -1);
            		jo.put("message", "该用户已存在，请确认");
                    return jo.toJSONString();
        		}
    			u = new User();
    	        u.setSalt(ShiroKit.getRandomSalt(5));
    	        u.setPassword(ShiroKit.md5(password, u.getSalt()));
    	        u.setStatus(ManagerStatus.OK.getCode());
    		}else {
        		//修改或新增
        		if(u==null||u.getId()==null){
            		//新增
        			u = new User();
        	        u.setSalt(ShiroKit.getRandomSalt(5));
        	        u.setPassword(ShiroKit.md5(password, u.getSalt()));
        	        u.setStatus(ManagerStatus.OK.getCode());
        		}else{
            		//修改
                    DeptUser wrapper = new DeptUser();
                    wrapper.setUserId(u.getId());
                    wrapper.setDeptId(d.getId());
            		du = deptUserMapper.selectOne(wrapper);
        	        u.setPassword(ShiroKit.md5(password, u.getSalt()));
        		}
    		}
    		u.setDeptId(d.getId());
			u.setName(userName);
			u.setLoginName(loginName);
			u.setUserCode(code);
    		if(CommonUtil.isEmpty(u.getId())){
    			u.insert();
    		}else{
    			u.updateById();
    		}
    		if(du==null||du.getId()==null){
    			du = new DeptUser();
        		du.setUserId(u.getId());
        		du.setDeptId(d.getId());
        		du.insert();
    		}else{
        		du.setUserId(u.getId());
        		du.setDeptId(d.getId());
    			du.updateById();
    		}
		}
		jo.put("statusCode", 0);
		jo.put("message", "操作成功");
        return jo.toJSONString();
    }
}